import { Application } from "egg";
import { DaHuaICCBaseService } from "./base";
import { dahua } from "./type";

/**
 * 大华 ICC 角色管理
 */
export class RoleService extends DaHuaICCBaseService {
	constructor(app: Application, config: dahua.icc.ICCConfig) {
		super(app, config);
	}

	/**
	 * 新增角色
	 * @description 新增角色信息
	 * @param params 角色信息
	 * @param params.roleName 角色名称
	 * @param params.roleGrade 角色等级
	 * @param params.ownerCode 所属组织
	 * @param params.menus 菜单信息
	 * @param [params.memo] 角色描述
	 * @param [params.defaultRole] 默认角色
	 * @param [params.allMenus] 是否全量菜单
	 * @param [params.organizations] 当前角色有权限的组织节点
	 * @param [params.departments] 当前角色有权限的部门节点
	 * @param [params.logicOrgCodes] 逻辑组织编码
	 * @param [params.logicOrganizations] 逻辑组织
	 * @param [params.subsystemResource] 子系统资源
	 * @returns 新增的角色ID
	 */
	async add(params: dahua.icc.role.AddRoleRequest): Promise<dahua.icc.IResponse<dahua.icc.role.AddRoleResponse>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.2.0/role`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.role.AddRoleResponse>>(url, {
			method: "post",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
			data: params,
		});
		this.handleResponseException(res);
		return res.data;
	}

	/**
	 * 更新角色
	 * @description 更新角色信息
	 * @param params 角色信息
	 * @param params.id 角色ID，不支持修改
	 * @param params.roleName 角色名称，不支持修改
	 * @param params.roleGrade 角色等级
	 * @param params.menus 菜单信息
	 * @param [params.memo] 角色描述
	 * @param [params.ownerCode] 所属组织
	 * @param [params.defaultRole] 默认角色
	 * @param [params.allMenus] 是否全量菜单
	 * @param [params.organizations] 当前角色有权限的组织节点
	 * @param [params.departments] 当前角色有权限的部门节点
	 * @param [params.logicOrgCodes] 逻辑组织编码
	 * @param [params.logicOrganizations] 逻辑组织
	 * @param [params.subsystemResource] 子系统资源
	 * @returns 更新的角色ID
	 */
	async update(params: dahua.icc.role.UpdateRoleRequest): Promise<dahua.icc.IResponse<dahua.icc.role.UpdateRoleResponse>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.2.0/role`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.role.UpdateRoleResponse>>(url, {
			method: "put",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
			data: params,
		});
		this.handleResponseException(res);
		return res.data;
	}

	/**
	 * 删除角色
	 * @description 删除角色信息
	 * @param params.ids 需要删除的角色id集合
	 * @returns 删除结果
	 */
	async delete(params: dahua.icc.role.DeleteRoleRequest): Promise<dahua.icc.IResponse<dahua.icc.role.DeleteRoleResponse>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.0.0/role/delete`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.role.DeleteRoleResponse>>(url, {
			method: "post",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
			data: params,
		});
		this.handleResponseException(res);
		return res.data;
	}

	/**
	 * 查询角色详情
	 * @description 查询角色详细信息
	 * @param id 角色ID
	 * @returns 角色详细信息
	 */
	async getDetail(id: number): Promise<dahua.icc.IResponse<dahua.icc.role.RoleDetailResponse>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.0.0/role/detail/${id}`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.role.RoleDetailResponse>>(url, {
			method: "get",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
		});
		this.handleResponseException(res);
		return res.data;
	}

	/**
	 * 分页查询角色信息
	 * @description 分页查询角色列表
	 * @param params 查询参数
	 * @returns 分页数据
	 */
	async queryPage(
		params: dahua.icc.role.RolePageQueryParams
	): Promise<dahua.icc.IResponse<dahua.icc.PageVO<dahua.icc.role.RoleInfoVO>>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.2.0/role/subsystem/page`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.PageVO<dahua.icc.role.RoleInfoVO>>>(url, {
			method: "post",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
			data: params,
		});
		this.handleResponseException(res);
		return res.data;
	}

	/**
	 * 角色全量数据同步
	 * @description 全量同步角色数据
	 * @param params 同步参数
	 * @param [params.pageNum] 当前页, 默认1
	 * @param [params.pageSize] 每页记录数, 默认10
	 * @param [params.menuNeed] 是否获取菜单数据 默认是0
	 * @returns 角色分页数据
	 */
	async syncPage(params: dahua.icc.role.RoleSyncPageParams): Promise<dahua.icc.IResponse<dahua.icc.PageVO<dahua.icc.role.RoleSyncInfo>>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.2.0/role/list-page`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.PageVO<dahua.icc.role.RoleSyncInfo>>>(url, {
			method: "post",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
			data: params,
		});
		this.handleResponseException(res);
		return res.data;
	}

	/**
	 * 用户导航菜单查询
	 * @description 获取用户导航菜单信息
	 * @param terminal 当前终端，web端：1，客户端：2，移动端：3
	 * @returns 导航菜单数据
	 */
	async getNavigation(terminal: number): Promise<dahua.icc.IResponse<dahua.icc.role.NavigationResponse>> {
		const url = `${this.config.baseUrl}/evo-apigw/evo-brm/1.0.0/user/navigation`;
		const res = await this.curl<dahua.icc.IResponse<dahua.icc.role.NavigationResponse>>(url, {
			method: "get",
			headers: {
				Authorization: `bearer ${this.accessToken}`,
			},
			contentType: "json",
			dataType: "json",
			data: { terminal },
		});
		this.handleResponseException(res);
		return res.data;
	}
}
